package org.fjsei.yewu.util;

import md.system.User;
import md.system.UserRepository;
import org.fjsei.yewu.security.JwtUser;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;

import java.util.UUID;


@Component
public class Base {
    //不能加 static:
    protected final UserRepository userRepository;

    public Base(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    //验证是否登录，谁登录，有那些角色的。后端自己用的，前端不可以调用。
    public User checkAuth() {
        /*
        获取servlet路径来鉴定权限。 和ROLE_xxx交叉了，又是接口安全域又是角色，多关联关系？复合主码＋? 接口Path+UserName。
        简化做法： 直接从ROLE_字符串区分安全域接口。 ROLE_Outer_xx; ROLE_Main_xx 复合型的权限代码;每个接口默认ROLE_都是唯一性差异来区分。
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        String servletPath =request.getServletPath();
        */
        Authentication auth= SecurityContextHolder.getContext().getAuthentication();
        if(auth==null)  return null;
        //graphql这块即时没登录也会有系统角色ROLE_ANONYMOUS，奇葩！
        Object principal=auth.getPrincipal();
        if(principal instanceof JwtUser){
            UUID userid=((JwtUser) principal).getId();
            //   UserDetails userDetails = jwtUserDetailsService.loadUserByUsername(name);
            //Long userId=Long.valueOf(12);
            //           return userRepository.findById(userid).orElse(null);
            return userRepository.findByUsername(((JwtUser) principal).getUsername());
        }else if(principal instanceof org.springframework.security.core.userdetails.User){
            String username=((org.springframework.security.core.userdetails.User) principal).getUsername();
            return userRepository.findByUsername(username);
        }else{
            //没有登录的也Authenticated! 有anonymousUser 有ROLE_ANONYMOUS；
            return null;
        }
    }
}

